/**
 * @file SnakerPlayer.h
 * @brief 包含虚拟相机类和玩家主体类。
 */

#include "MainInclude.h"
#include "SnakerMap.h"
// using namespace std;

/**
 * @brief 虚拟相机
 * @param size 相机大小
 * @param position 相机绝对坐标
 */
class SnakerCamera {
public:
    int size[2]; ///< 相机大小
    int position[2]; ///< 相机绝对坐标
    int x, y;

    /**
     * @brief 构造函数
     */
    SnakerCamera(int x, int y);
    /**
     * @brief 将相机画面渲染成字符串
     * 
     * 每行画面用回车分隔开
     * 在渲染前会将视野内的所有区块执行扩展生成操作，确保视野内一定会有区块，
     * 避免内存错误
     */
    std::string Render2String(SnakerMap* map);
    // char** Render2StringC(SnakerMap* map);
    /**
     * @brief 相机边框重新定义大小
     */
    void Resize(int x, int y);
    /**
     * @brief 在当前位置步进相机
     * 
     * 接受的第二个参数为步进步数，注意x轴向下
     */
    void Move(int direct, int speed);
    /**
     * @brief 将相机瞬移到指定位置
     */
    void Move(std::pair<int, int>);
};

/**
 * @brief 玩家主体
 * @param isDead 死亡标记，主函数在为true时跳过对其执行的所有操作，仅保留计分板
 * @param len 长度，实际未投入使用
 * @param score 分数
 * @param speed 速度
 * @param poslist 身体节点列表，在所有节点之间划线便是一整条蛇
 * @param bufflist 这条蛇当前的所有buff，在buff持续时间为零时跳过这条buff
 * @param paintBoard 用来储存蛇身绘制信息的中转变量
 * @param chunkSet 用来储存蛇所在chunks的集合
 */
class SnakerPlayer {
   public:
    bool isDead;
    int len;
    int score;
    std::list<std::pair<int, int>> posList;
    std::vector<buff> buffList;
    std::string appearance;
    int speed;
    // int incomingCmd;
    SnakerMap* map;

    std::set<SnakerChunk*> chunkSet;
    std::vector<std::pair<std::pair<char, int>, std::pair<int, int>>> paintBoard; ///< 外表，位置
    /**
     * @brief 构造函数
     */
    SnakerPlayer(SnakerChunk* spawn, SnakerMap* map_);
    /**
     * @brief 死亡钩子函数
     * 
     * 主要用来把蛇身biu成P点
     */
    void Die();

    /**
     * @brief 析构函数
     */
    ~SnakerPlayer();

    // vector<pair<int, int>> ListPos();
    // vector<buff> ListBuff();
    /**
     * @brief 添加buff
     */
    void AddBuff(std::vector<buff> incomingBuff);
    /**
     * @brief 每一帧对蛇进行更新
     * 
     * 转向（可选）\n
     * 步进（依赖玩家当前的速度值）\n
     * 执行bufflist，buff在这里具体实现\n
     * 更新chunkSet和paintBoard，为绘制做准备\n
     */
    int Update(int cmd, SnakerCamera* cam);
};